package object3;

/**
 * final使用细节
 */
public class FinalDetail01 {

    public static void main(String[] args) {

        /*
            1) final 修饰的属性又叫常量，一般用 XX_XX_XX命名
            2) final 修饰的属性在定义时，必须赋初值，并且以后不能修改
               1.可以在定义时赋初值
               2.可以在构造器中赋初值
               3.可以在代码块中赋初值
            3) 如果final修饰的属性是静态的，则初始化的位置只能是：
               1. 定义时
               2. 在静态代码块 不能在构造器中赋值
            4) final类不能继承，但是可以实例化对象
            5) 如果类不是final类，但含有 final 方法，则该方法虽然不能重写，但是可以被继承
         */
        TestFinalDetail013 testFinalDetail013 = new TestFinalDetail013();
    }
}

class TestFinalDetail01 {

    /*
        1. 定义时：如 public final double TAX_RATE=0.08;
        2. 在构造器中
        3. 在代码块中
    */
    public final double TAX_RATE = 0.08;//1.定义时赋值
    public final double TAX_RATE2 ;
    public final double TAX_RATE3 ;

    public TestFinalDetail01() {
        TAX_RATE2 = 1.1;
    }

    {
        TAX_RATE3 = 1.2;
    }
}

class TestFinalDetail012 {
    /*
        如果final 修饰的属性是静态的，则初始化的位置只能是
        1 定义时 2 在静态代码块 不能在构造器中赋值。
    */
    public static final double TAX_RATE = 99.9;
    public static final double TAX_RATE2 ;

    static {
        TAX_RATE2 = 1.1;
    }
}

//final类不能继承，但是可以实例化对象
final class TestFinalDetail013 {}